package model.dao;

import java.io.Serializable;

import model.dao.admin.HibernateAdminDAO;
import model.dao.reprodutivo.HibernateCoberturaDAO;
import model.dao.reprodutivo.HibernateDestinoDAO;
import model.dao.reprodutivo.HibernateLeitaoDAO;
import model.dao.reprodutivo.HibernateLeitegadaDAO;
import model.dao.reprodutivo.HibernateObsLeitegadaDAO;
import model.dao.reprodutivo.HibernateParicaoDAO;
import model.dao.reprodutivo.HibernatePesoDAO;
import model.dao.reprodutivo.HibernatePorcaDAO;
import model.dao.reprodutivo.HibernateRacaDAO;
import model.dao.reprodutivo.HibernateReprodutorDAO;
import model.dao.reprodutivo.HibernateSuinoDAO;
import model.dao.reprodutivo.HibernateTecnicoResponsavelDAO;
import model.dao.reprodutivo.HibernateTentativaDAO;
import model.dao.usuario.HibernateUsuarioDAO;
import model.interfaces.DAOFactory;
import model.interfaces.HibernateGenericDAO;
import model.interfaces.admin.AdminDAO;
import model.interfaces.reprodutivo.CoberturaDAO;
import model.interfaces.reprodutivo.DestinoDAO;
import model.interfaces.reprodutivo.LeitaoDAO;
import model.interfaces.reprodutivo.LeitegadaDAO;
import model.interfaces.reprodutivo.ObsLeitegadaDAO;
import model.interfaces.reprodutivo.ParicaoDAO;
import model.interfaces.reprodutivo.PesoDAO;
import model.interfaces.reprodutivo.PorcaDAO;
import model.interfaces.reprodutivo.RacaDAO;
import model.interfaces.reprodutivo.ReprodutorDAO;
import model.interfaces.reprodutivo.SuinoDAO;
import model.interfaces.reprodutivo.TecnicoResponsavelDAO;
import model.interfaces.reprodutivo.TentativaDAO;
import model.interfaces.usuario.UsuarioDAO;
import model.vos.admin.Admin;
import model.vos.reprodutivo.Cobertura;
import model.vos.reprodutivo.Destino;
import model.vos.reprodutivo.Leitao;
import model.vos.reprodutivo.Leitegada;
import model.vos.reprodutivo.ObsLeitegada;
import model.vos.reprodutivo.Paricao;
import model.vos.reprodutivo.Peso;
import model.vos.reprodutivo.Porca;
import model.vos.reprodutivo.Raca;
import model.vos.reprodutivo.Reprodutor;
import model.vos.reprodutivo.Suino;
import model.vos.reprodutivo.TecnicoResponsavel;
import model.vos.reprodutivo.Tentativa;
import model.vos.usuario.Usuario;

import org.hibernate.Session;
import org.hibernate.Transaction;

import resources.util.HibernateUtil;

public class HibernateDAOFactory extends DAOFactory implements Serializable{

	
	private static final long serialVersionUID = -1088015917640494745L;
	private Session session;
	private Transaction tx;

	public HibernateDAOFactory() {
		this.session = HibernateUtil.getSession();
	}

	@Override
	public void iniciarTransacao() {
		this.tx = this.session.beginTransaction();
	}

	@Override
	public void cancelarTransacao() {
		this.tx.rollback();
		this.tx = null;
	}

	@Override
	public void encerrar() {
		if (this.tx != null) {
			this.tx.commit();
		}
		this.session.close();
	}

	@Override
	public UsuarioDAO getUsuarioDAO() {
		return new HibernateUsuarioDAO(this.session);
	}

	@Override
	public AdminDAO getAdminDAO() {
		return new HibernateAdminDAO(this.session);
	}

	@Override
	public CoberturaDAO getCoberturaDAO() {
		return new HibernateCoberturaDAO(this.session);
	}

	@Override
	public DestinoDAO getDestinoDAO() {
		return new HibernateDestinoDAO(this.session);
	}

	@Override
	public LeitaoDAO getLeitaoDAO() {
		return new HibernateLeitaoDAO(this.session);
	}

	@Override
	public LeitegadaDAO getLeitegadaDAO() {
		return new HibernateLeitegadaDAO(this.session);
	}

	@Override
	public ObsLeitegadaDAO getObsLeitegadaDAO() {
		return new HibernateObsLeitegadaDAO(this.session);
	}

	@Override
	public ParicaoDAO getParicaoDAO() {
		return new HibernateParicaoDAO(this.session);
	}

	@Override
	public PesoDAO getPesoDAO() {
		return new HibernatePesoDAO(this.session);
	}

	@Override
	public PorcaDAO getPorcaDAO() {
		return new HibernatePorcaDAO(this.session);
	}

	@Override
	public RacaDAO getRacaDAO() {
		return new HibernateRacaDAO(this.session);
	}

	@Override
	public ReprodutorDAO getReprodutorDAO() {
		return new HibernateReprodutorDAO(this.session);
	}

	@Override
	public SuinoDAO getSuinoDAO() {
		return new HibernateSuinoDAO(this.session);
	}

	@Override
	public TecnicoResponsavelDAO getTecnicoResponsavelDAO() {
		return new HibernateTecnicoResponsavelDAO(this.session);
	}

	@Override
	public TentativaDAO getTentativaDAO() {
		return new HibernateTentativaDAO(this.session);
	}

	@Override
	public HibernateGenericDAO getDAO(Object o) {

		if (o instanceof Usuario) {
			return new HibernateUsuarioDAO(this.session);
		} else if (o instanceof Admin) {
			return new HibernateAdminDAO(this.session);
		}else if (o instanceof Cobertura) {
			return new HibernateCoberturaDAO(this.session);
		}else if (o instanceof Destino) {
			return new HibernateDestinoDAO(this.session);
		}else if (o instanceof Leitao) {
			return new HibernateLeitaoDAO(this.session);
		}else if (o instanceof Leitegada) {
			return new HibernateLeitegadaDAO(this.session);
		}else if (o instanceof ObsLeitegada) {
			return new HibernateObsLeitegadaDAO(this.session);
		}else if (o instanceof Paricao) {
			return new HibernateParicaoDAO(this.session);
		}else if (o instanceof Peso) {
			return new HibernateAdminDAO(this.session);
		}else if (o instanceof Porca) {
			return new HibernatePorcaDAO(this.session);
		}else if (o instanceof Peso) {
			return new HibernatePesoDAO(this.session);
		}else if (o instanceof Raca) {
			return new HibernateRacaDAO(this.session);
		}else if (o instanceof Reprodutor) {
			return new HibernateReprodutorDAO(this.session);
		}else if (o instanceof Suino) {
			return new HibernateSuinoDAO(this.session);
		}else if (o instanceof TecnicoResponsavel) {
			return new HibernateTecnicoResponsavelDAO(this.session);
		}else if (o instanceof Tentativa) {
			return new HibernateTentativaDAO(this.session);
		}
		return null;

	}

}
